<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * Created by PhpStorm.
 * The project “dev”
 * File name “Public.php”
 *
 * User: znx
 * Company: 思议创想
 * Q  Q: 865303386
 * Site: www.siyi360.com
 *
 * Date: 2017-02-10
 * Time: 18:49
 */
class Common extends CI_Controller {
    /**
     * get_all_action
     * 获取指定控制器下的所有方法
     *
     * @param string $controllerName 控制器名
     */
    public function get_all_action($controllerName)
    {
        // 获取指定控制器下的所有方法
        $data = getAllController()[$controllerName];

        // 遍历获取到的所有方法数据数组，过滤保留方法
        $action = array();
        foreach ($data as $key=>$val) {
            switch ($val) {
                case 'save':    // 数据保存操作方法
                    unset($key);
                    break;
                case 'repeat':  // 数据是否重复验证操作方法
                    unset($key);
                    break;
                default :
                    $action[$key] = $val;
                    break;
            }
        }

        $result = array('status'=>1, 'msg'=>'success', 'data'=>$action);
        exit(json_encode($result));
    }

    /**
     * verify_code
     * 图形验证码
     *
     * @param int $width 验证码宽度
     * @param int $height 验证码高度
     */
    public function verify_code($width=150, $height=44)
    {
        $captch = new \Minho\Captcha\CaptchaBuilder();

        $captch->initialize([
            'width' => $width,      // 宽度
            'height' => $height,    // 高度
            'line' => false,        // 直线
            'curve' => true,        // 曲线
            'noise' => 1,           // 噪点背景
            'fonts' => []           // 字体
        ]);
        $captch->create();

        $captch->output(1);

        $this->session->set_userdata('verify_code', $captch->getText());
    }

    /*
     * user_check
     * 验证系统用户是否可用
     * 检测相同用户名的用户是否已经存在
     *
     * @access pubic
     * @param string $curr_user_name 用户名(编辑状态下的当前用户名)
     * */
    public function user_check($curr_user_name='')
    {
        $this->load->model('system/User_model');
        if (IS_POST) {
            $return = $this->User_model->user_check($_POST['user_name'], $curr_user_name);
            exit(json_encode($return));
        }
    }

    /*
     * member_check
     * 验证网站会员信息是否可用 手机/邮箱验证
     *
     * @access public
     * @param string $t 需要验证的信息类型 mobile、email
     * */
    public function member_check($t) {
        $this->load->model('member/Member_model');

        switch ($t)
        {
            case 'mobile':
                if (IS_POST) {
                    $return = $this->Member_model->member_check($t, $_POST['member_mobile']);
                    exit(json_encode($return));
                }
                break;
            case 'email':
                if (IS_POST) {
                    $return = $this->Member_model->member_check($t, $_POST['member_email']);
                    exit(json_encode($return));
                }
                break;
        }
    }

    /*
     * sports_type_json
     * 获取运动类型的json数据
     *
     * @access public
     * @param int $sports_id 运动项目id
     * */
    public function sports_type_json($sports_id='')
    {
        $this->load->model('goods/Sports_model');

        $sports_id = $sports_id==''? $_GET['sports_id']:$sports_id;

        $return = $this->Sports_model->sports_type_get(2, $sports_id);
        exit(json_encode($return));
    }

    /*
     * prompt
     * 提示信息
     *
     * @access public
     * */
    public function prompt()
    {
        $act = $this->uri->segment(2);
        switch ($act) {
            case 'not_login':
                $data = array(
                    'content'=>'您还未登录！',
                    'url'=>site_url('login'),
                    'target'=>'top'
                );
                break;
            case 'auth':
                $data = array(
                    'content'=>'抱歉，您无权限进行此操作！',
                    'url'=>$_SERVER['HTTP_REFERER'],
                    'target'=>''
                );
                break;
            case 'user_safe_login':
                $data = array(
                    'content'=>'您的账号安全信息已更新，请重新登录！',
                    'url'=>site_url('login'),
                    'target'=>'top'
                );
                break;
            case 'top_error':
                $data = array(
                    'content'=>'抱歉，您的操作失败！',
                    'url'=>$_SERVER['HTTP_REFERER'],
                    'target'=>'top'
                );
                break;
            default:
                $data = array(
                    'content'=>'欢迎使用本管理系统！',
                    'url'=>site_url('index'),
                    'target'=>'top'
                );
        }

        $this->load->view('common/prompt', $data);
    }

    /*
     * upload_file
     * 文件上传处理
     *
     * @access public
     * */
    public function upload_file()
    {
        $saveDir = $_POST['saveDir']; //文件保存目录

        //文件类型与文件大小，根据$_GET['dir']参数判断请求来路，专门针对kindeditor编辑器做的特殊处理
        if (is_array($_GET) && count($_GET)>0) { //因为从web uploader过来的请求没有$_GET['dir']这个参数，做的临时处理
            switch ($_GET['dir'])
            {
                case 'image': //普通文件
                    $fileType = explode(',', explode('|', $_POST['imageType'])[0]); //文件类型
                    $fileSize = (int)explode('|', $_POST['imageType'])[1]; //文件大小
                    break;
                case 'file': //普通文件
                    $fileType = explode(',', explode('|', $_POST['filesType'])[0]); //文件类型
                    $fileSize = (int)explode('|', $_POST['filesType'])[1]; //文件大小
                    break;
                case 'media': //影音文件
                    $fileType = explode(',', explode('|', $_POST['mediaType'])[0]); //文件类型
                    $fileSize = (int)explode('|', $_POST['mediaType'])[1]; //文件大小
                    break;
                case 'flash': //动画文件
                    $fileType = explode(',', explode('|', $_POST['flashType'])[0]); //文件类型
                    $fileSize = (int)explode('|', $_POST['flashType'])[1]; //文件大小
                    break;
                default : //$_GET['dir']参数为空或者其他，表示从其他地方过来的请求
                    $fileType = explode(',', $_POST['fileType']); //文件类型
                    $fileSize = (int)$_POST['fileSize']/1024; //文件大小，从web uploader传过来的文件大小单位是字节，所以这里需要换算
            }
        } else {
            $fileType = explode(',', $_POST['fileType']); //文件类型
            $fileSize = (int)$_POST['fileSize']/1024; //文件大小，从web uploader传过来的文件大小单位是字节，所以这里需要换算
        }


        $dirLevel = '..'; //目录层级
        $filePath = '/uploads/'.$saveDir; //文件保存路径

        //判断目录是否存在，不存在则自动创建
        if(!is_readable($dirLevel.$filePath))
        {
            is_file($dirLevel.$filePath) or mkdir($dirLevel.$filePath, 0700, true);
        }

        $config['upload_path'] = $dirLevel.$filePath; //文件上传目录
        //$config['allowed_types'] = str_replace(',', '|', $_POST['fileType']); //允许的文件上传格式 'gif|jpg|jpeg|png'
        $config['allowed_types'] = $fileType;
        $config['file_name'] = time(); //上传后保存的文件名
        $config['overwrite'] = true; //是否覆盖相同文件名文件，否则自动将已有同名文件名后加上一个数字
        $config['file_ext_tolower'] = true; //将文件后缀转为小写
        $config['max_size'] = $fileSize; //文件大小 单位：KB
        $config['max_width'] = '0'; //最大图片宽度，0为不限制
        $config['max_height'] = '0'; //最大图片高度，0为不限制
        $config['min_width'] = '0'; //最小图片高度，0为不限制
        $config['min_height'] = '0'; //最小图片高度，0为不限制
        $config['max_filename'] = '0'; //文件名最大长度，0为不限制
        $config['max_filename_increment'] = 100; //当 overwrite 参数设置为 FALSE 时，将会在同名文件的后面加上一个自增的数字 这个参数用于设置这个数字的最大值
        $config['encrypt_name'] = false; //是否将文件名转换为随机字符串
        $config['remove_spaces'] = true; //是否将文件名中的空格转换为下划线
        $config['detect_mime'] = true; //将会在服务端对文件类型进行检测，可以预防代码注入攻击
        $config['mod_mime_fix'] = true; //带有多个后缀名的文件将会添加一个下划线后缀 这样可以避免触发 Apache mod_mime

        $this->load->library('upload', $config);
        $this->upload->initialize($config);

        $field_name = 'file';



        if (!$this->upload->do_upload($field_name)) {
            $error = $this->upload->display_errors('', '');
            $result = array('status'=>0, 'msg'=>$error, 'result'=>'', 'error'=>1, 'message'=>$error);
        } else {
            $data = $this->upload->data();

            //解决kindeditor编辑器图片批量上传时无法正常返回上传后的文件名问题
            if ($data['file_name']===$data['client_name']) { //判断上传后的文件名是否与本地文件名相同
                //$formName = array_keys($_FILES)[0]; //获取$_FILES的一维key，也就是文件域名表单名称
                $tmp_name = $_FILES[$field_name]['tmp_name']; //获取已经上传成功的系统临时目录的文件

                //将文件移动到网站的文件上传目录，并进行重命名
                if (move_uploaded_file($tmp_name, $config['upload_path'].'/'.$config['file_name'].$data['file_ext'])) {
                    $data['file_name'] = $config['file_name'].$data['file_ext'];
                } else {
                    $result = array('status'=>0, 'msg'=>'上传失败！', 'result'=>'', 'error'=>1, 'message'=>'上传失败！');
                }
            } else {
                if (empty($data['file_name']) || $data['file_name']===$data['client_name']) {
                    $result = array('status'=>0, 'msg'=>'上传失败！', 'result'=>'', 'error'=>1, 'message'=>'上传失败！');
                } else {
                    $result = array('status'=>1, 'msg'=>'上传成功！', 'url'=>$filePath.'/'.$data['file_name'], 'adminUrl'=>$config['upload_path'].'/'.$data['file_name'], 'error' => 0, 'message'=>'上传成功！');
                }
            }
        }

        exit(json_encode($result));
    }

    /*
     * remote_file
     * 远程文件浏览 kindeditor编辑器专用
     *
     * @access public
     * */
    public function remote_file_view() {
        //根目录路径，可以指定绝对路径，比如 /var/www/attached/
        $root_path = '../uploads/'.$this->uri->segment(3).'/';

        //根目录URL，可以指定绝对路径，比如 http://www.yoursite.com/attached/
        $root_url = '/uploads/'.$this->uri->segment(3).'/';

        //图片扩展名
        $ext_arr = array('gif', 'jpg', 'jpeg', 'png', 'bmp');

        //根据path参数，设置各路径和URL
        if (empty($_GET['path'])) {
            $current_path = realpath($root_path) . '/';
            $current_url = $root_url;
            $current_dir_path = '';
            $moveup_dir_path = '';
        } else {
            $current_path = realpath($root_path) . '/' . $_GET['path'];
            $current_url = $root_url . $_GET['path'];
            $current_dir_path = $_GET['path'];
            $moveup_dir_path = preg_replace('/(.*?)[^\/]+\/$/', '$1', $current_dir_path);
        }

        //排序形式，name or size or type
        $order = empty($_GET['order']) ? 'name' : strtolower($_GET['order']);

        //不允许使用..移动到上一级目录
        if (preg_match('/\.\./', $current_path)) {
            echo 'Access is not allowed.';
            exit;
        }

        //最后一个字符不是/
        if (!preg_match('/\/$/', $current_path)) {
            echo 'Parameter is not valid.';
            exit;
        }

        //目录不存在或不是目录
        if (!file_exists($current_path) || !is_dir($current_path)) {
            echo 'Directory does not exist.';
            exit;
        }

        //遍历目录取得文件信息
        $file_list = array();
        if ($handle = opendir($current_path)) {
            $i = 0;
            while (false !== ($filename = readdir($handle))) {
                if ($filename{0} == '.') continue;
                $file = $current_path . $filename;
                if (is_dir($file)) {
                    $file_list[$i]['is_dir'] = true; //是否文件夹
                    $file_list[$i]['has_file'] = (count(scandir($file)) > 2); //文件夹是否包含文件
                    $file_list[$i]['filesize'] = 0; //文件大小
                    $file_list[$i]['is_photo'] = false; //是否图片
                    $file_list[$i]['filetype'] = ''; //文件类别，用扩展名判断
                } else {
                    $file_list[$i]['is_dir'] = false;
                    $file_list[$i]['has_file'] = false;
                    $file_list[$i]['filesize'] = filesize($file);
                    $file_list[$i]['dir_path'] = '';
                    $file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
                    $file_list[$i]['is_photo'] = in_array($file_ext, $ext_arr);
                    $file_list[$i]['filetype'] = $file_ext;
                }
                $file_list[$i]['filename'] = $filename; //文件名，包含扩展名
                $file_list[$i]['datetime'] = date('Y-m-d H:i:s', filemtime($file)); //文件最后修改时间
                $i++;
            }
            closedir($handle);
        }

        //排序
        function cmp_func($a, $b) {
            global $order;
            if ($a['is_dir'] && !$b['is_dir']) {
                return -1;
            } else if (!$a['is_dir'] && $b['is_dir']) {
                return 1;
            } else {
                if ($order == 'size') {
                    if ($a['filesize'] > $b['filesize']) {
                        return 1;
                    } else if ($a['filesize'] < $b['filesize']) {
                        return -1;
                    } else {
                        return 0;
                    }
                } else if ($order == 'type') {
                    return strcmp($a['filetype'], $b['filetype']);
                } else {
                    return strcmp($a['filename'], $b['filename']);
                }
            }
        }
        usort($file_list, 'cmp_func');

        $result = array();

        //相对于根目录的上一级目录
        $result['moveup_dir_path'] = $moveup_dir_path;

        //相对于根目录的当前目录
        $result['current_dir_path'] = $current_dir_path;

        //当前目录的URL
        $result['current_url'] = $current_url;

        //文件数
        $result['total_count'] = count($file_list);

        //文件列表数组
        $result['file_list'] = $file_list;


        //输出JSON字符串
        header('Content-type: application/json; charset=UTF-8');
        exit(json_encode($result));
    }

    /*
     * del_file
     * 删除指定路径文件
     *
     * @access public
     * */
    public function del_file()
    {
        $file = '..'.$_GET['file'];
        if (empty($file) || $file==='..') {
            //$result = array('status'=>0, 'msg'=>'无有清除！', 'result'=>'');
        } else {
            if (!file_exists($file)) {
                $result = array('status'=>0, 'msg'=>'文件不存在，操作失败！', 'result'=>'');
            } else {
                if (@unlink($file)) {
                    $result = array('status'=>1, 'msg'=>'操作成功！', 'result'=>'');
                }
            }
        }
        exit(json_encode($result));
    }
}